package com.huawei.hwclouds.lubanops.demo.common.client;

import com.huawei.hwclouds.lubanops.demo.common.exception.ErrorCodeException;
import com.huawei.hwclouds.lubanops.demo.common.exception.common.HttpStatusException;
import com.huawei.hwclouds.lubanops.demo.common.json.JsonUtil;

/**
 * 所有的http格式的api调用的基类，主要实现 结果对象的转换，异常处理等<br>
 *
 * @author y00438022
 * @since 2020年3月2日
 */
public class LubanopsClientBase {

    /**
     * 实现将http调用的结果转换成业务对象，如果http状态码错误，或者返回的结果里面有业务错误，那么就抛出异常 <br>
     * 如果状态码是200，那么返回的结果可能是这样的
     * {
     * "error_code:"apm2.00000001",
     * "error_msg":"internal error",
     * "error_message":"some message"  //这个异常在线上不会出现，如果内部服务之间调用可以带上，用来查看异常消息
     * }
     * 或者正确的情况
     * {
     * "xxx:"xxxx",
     * "yyy":"yyyy"
     * }
     *
     * @param result
     * @param responseType
     * @return
     * @author y00438022
     * @since 2020年3月2日
     */
    protected static <T> T populateResult(HttpCallResult result, Class<T> responseType) {
        if (result.getStatus() == 200) {
            ErrorCodeException exception = ErrorCodeException.toErrorCodeException(result.getContent());
            if (exception == null) { //代表没有错误
                return JsonUtil.parseObject(result.getContent(), responseType);
            } else {
                throw exception;
            }
        } else {
            throw new HttpStatusException(result.getStatus(), result.getContent());
        }
    }

}
